package com.itheima.controller;


import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * 文件上传介绍
 */
@RestController
@RequestMapping("/common")
@Slf4j
public class UploadController {

    @Value("${fileDir.name}")
    private String fileURLPath;

    //  上传
    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {
        //  file必须跟请求中的名称一样 . 是一个临时文件，需要转存到指定位置，否则本次请求完成后临时文件会删除
        //   System.out.println(file.getOriginalFilename());    //原始文件名
        // 给上传到服务器的文件重命名,并且名字必须唯一
        String uuidName = UUID.randomUUID().toString();  //  将UUID转化为String
        log.info("原始文件名为:{}", file.getOriginalFilename());
        String originalFilename = file.getOriginalFilename();  // 获得原文件名称
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));  // 获得文件的后缀  .jpg
        uuidName = uuidName + substring;
        //保存到服务器本地  也可以使用 输出流进行本地存储
        file.transferTo(new File(fileURLPath + uuidName));
//        FileOutputStream fos = new FileOutputStream(fileURLPath + uuidName);
//        fos.write(file.getBytes());
        return R.success(uuidName);
    }

    //  下载
    @Autowired
    private HttpServletResponse response;

    /**
     * 解决不能上传大文件的方案  在 application.yml 中配置
     * servlet:
     * multipart:
     * file-size-threshold:
     */
    @GetMapping("/download")
    public void download(String name) throws IOException {
        // 从浏览器本地读取到内存 返回到客户端
        FileInputStream is = new FileInputStream(fileURLPath + name);
        ServletOutputStream os = response.getOutputStream();
        byte[] bytes = new byte[1024];
        while (true) {
            int len = is.read(bytes);
            if (len == -1) {
                break;
            }
            os.write(bytes, 0, len);
        }
        os.close();
        is.close();
    }
}
